package Tencent;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Random;
import java.util.Scanner;

/**
 * 二倍均值法
 *  以10元10个红包为例，去除每个红包的最小金额0.01后，红包剩余9.90元，二倍均值计算公式：2 * 剩余金额/剩余红包数
 *      第一个红包在[0,1.98]范围随机，假设随机得1.9，则第一个红包金额为2.0，红包剩余8元。
 *      第二个红包在[0,2]范围随机，假设随机的1元，则第二个红包金额为1.1元，红包剩余7元。
 *      第三个红包在[0,2]范围随机，假设随机的0.5元，则第三个红包金额为0.6元，红包剩余5.5元。
 *      以此类推。
 */

public class RedPacket {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        BigDecimal min = new BigDecimal("0.01");
        BigDecimal amount = new BigDecimal(sc.nextInt() + "");
        BigDecimal num = new BigDecimal(sc.nextInt() + "");
        System.out.println(amount + "元" + num + "个人抢=======================================================");
        redPocket(amount, min, num);
    }

    /**
     * 红包方法
     * @param amount    红包总金额
     * @param min       保底金额（每人至少获得0.01或其他）
     * @param num       红包总数
     */
    private static void redPocket(BigDecimal amount,BigDecimal min ,BigDecimal num){
        // 先使用BigDecimal下的subtract()方法从总金额里把所有人的保底都扣除（amount - num * min）
        BigDecimal remain = amount.subtract(min.multiply(num));

        final Random random = new Random();                     // Random对象，用于获取随机数
        final BigDecimal hundred = new BigDecimal("100");   // 拿到一个值为 100 的BigDecimal
        final BigDecimal two = new BigDecimal("2");         // 拿到一个值为 2 的BigDecimal，用于二倍均值
        BigDecimal redPocket;
        for (int i = 0; i < num.intValue(); i++) {
            final int nextInt = random.nextInt(100);     // 生成一个[0,100)的随机int
            if(i == num.intValue() - 1){    // 如果是最后一个红包，那么最后一个红包就把剩下的全收走
                redPocket = remain;
            }else{      // 如果不是最后一个红包，那么就执行以下策略计算红包的值
                // redPocket = nextInt * 2 * [remain / (num - i)] / 100;    -->   二倍均值
                redPocket = new BigDecimal(nextInt).multiply(remain.multiply(two).divide(num.subtract(new BigDecimal(i)),2, RoundingMode.CEILING)).divide(hundred,2, RoundingMode.FLOOR);
            }
            if(remain.compareTo(redPocket) > 0){
                // 如果remain比redPocket多，也就是不会分到负数，就从剩余总额中扣减
                remain = remain.subtract(redPocket);
            }else{
                // 如果最后的redPocket比剩余余额还多了，就把余额扣减到 0
                remain = BigDecimal.ZERO;
            }
            // 最后把保底加上去，以防万一有人抽到了0元
            System.out.println("第"+(i+1)+"个人抢到红包金额为："+min.add(redPocket));
            System.out.println("剩余金额:" + remain);
        }
    }
}
